package kotlinx.coroutines.script

import abc.reflect.App
import kotlinx.coroutines.script.tes.ColorDiffer
import kotlinx.coroutines.script.tes.pt
import kotlinx.coroutines.script.tes.rgb
import kotlin.math.sqrt

object SMapBase {
    val sp = 7.pt

    val hitBlacksmith by lazy { // 青
        setOf(
            0xff767888.toInt().rgb(12),
            0xff68727d.toInt().rgb(12),
            0xff5b5b68.toInt().rgb(12),
            0xff5e6773.toInt().rgb(12),
            0xff51515f.toInt().rgb(12),
            0xff797b8b.toInt().rgb(12),
            0xff52525f.toInt().rgb(12),
            0xff494f56.toInt().rgb(12),
        )
    }
    val hitBlacksmithBorder by lazy {
        setOf(
            0xff9e9e9e.toInt().rgb(13),
            0xff858687.toInt().rgb(13),
            0xff848a94.toInt().rgb(13),
            0xff708485.toInt().rgb(13),
            // 先用原来的. 如果可以用


        )
    }
    val hitBlueDoor by lazy {
        setOf(
            0xff4e9fa0.toInt().rgb(21),
            0xff5FA6AA.toInt().rgb(21),
            0xff66c2c6.toInt().rgb(21),
            0xff74e4e2.toInt().rgb(21),

            // 高清
//            0xFF194C5C.toInt().rgb(16),
//            0xFF30666E.toInt().rgb(16),
//            0xFF38858F.toInt().rgb(16),
//            0xFF488F9B.toInt().rgb(16),
//            0xFF72CBCE.toInt().rgb(16),
//            0xFF8CECDE.toInt().rgb(16),
        ) // 青色　
    }
    val hitSpecialDoor by lazy {
        setOf(
            0xff213479.toInt().rgb(21),
            0xff244684.toInt().rgb(21),
            0xffa8e7bd.toInt().rgb(21),
            0xff273c80.toInt().rgb(21),
        ) // 青色　
    }
    val hitRedDoor by lazy {
        setOf(
            0xff8e0000.toInt().rgb(16),
        ) // 红色 // 疯王比如
    }
    ////////////
    val hitDeathRed by lazy {
        setOf(
            // 死亡标记 start
            0xff833717.toInt().rgb(40, 24, 24),
            // 死亡标记 end
            0xff9e4019.toInt().rgb(40, 24, 24),
        )
    }
    val hitSMapEnemyBlue by lazy {
        setOf(
            0xff5775f6.toInt().rgb(12), 0xff4c6ef6.toInt().rgb(8),
        )// 蓝
    }
    val hitSMapEnemyYellow by lazy {
        setOf(
            0xfff7c547.toInt().rgb(6, 6, 8),
            0xfff8cd49.toInt().rgb(6, 6, 8),
            0xffF8c617.toInt().rgb(6, 6, 8),
            0xffFFCA14.toInt().rgb(6, 6, 8),
        )// 黄
    }

    val hitEquipO by lazy {
        setOf(
            0xfff7c547.toInt().rgb(20, 20, 32),
            0xfff8cd49.toInt().rgb(20, 20, 32),
            0xffF8c617.toInt().rgb(20, 20, 32),
            0xffFFCA14.toInt().rgb(20, 20, 32),
        )// 橙色装备
    }

    val hitSMapEnemyOrange by lazy {
        setOf(
            0xffFF5400.toInt().rgb(15), // 内存读取的颜色
            0xffed602a.toInt().rgb(15), // 屏幕吸取的颜色
        )// 橙
    }
    val hitSMapEnemyPurple by lazy { // 紫色
        setOf(
            0xff89c1ba.toInt().rgb(9), 0xff8f2dba.toInt().rgb(9), // 副本牛角boss
            // 激流boss低血量start
            0xff764982.toInt().rgb(9), 0xff623d60.toInt().rgb(9),
            0xff593852.toInt().rgb(9), 0xff54334f.toInt().rgb(9),
            // 激流boss低血量end
            // 远古通关后
            0xFF7F49B8.toInt().rgb(9) // 分析聚合色 亡灵屠夫
        )// 紫
    }
    val hitSMapEnemyPurpleExclude by lazy {
        setOf(
            0xffc3cbb7.toInt().rgb(20), // 组队中间白色数字
        )
    }
    val hitSMapEnemyRedDot by lazy{
        setOf(
            0xff871910.toInt().rgb(12),
            0xff8b1a12.toInt().rgb(12),
            0xff4f0a05.toInt().rgb(12),
            0xff300a07.toInt().rgb(12),
            // 程序导出的实际颜色
            0xFF910000.toInt().rgb(6),
        )
    }
    val hitTeammate by lazy {
        setOf(
            0xFF48413A.toInt().rgb(8),// 截图分析的实际颜色
            0xffdddbc6.toInt().rgb(8),// 白色数字
            0xffc3ccb3.toInt().rgb(8),// 白色数字
            0xffC6CFC2.toInt().rgb(8),// 白色数字
            0xff406da5.toInt().rgb(20, 20, 12), // 涵盖下面
//            0xff4079ad.toInt().rgb(8), // 队友图标 start
//            0xff3969a3.toInt().rgb(8),
//            0xff437da7.toInt().rgb(8),
//            0xff3e6ea2.toInt().rgb(8),   // 队友图标 end
        )
    }

    val hitSMapNpc by lazy {
        setOf(
            0xff35df10.toInt().rgb(30, 10, 10),// 绿色
            0xff49b606.toInt().rgb(30, 15, 10),// 绿色
        )
    }
    val hitRedPointEnemy by lazy {
        setOf(
            0xffab1c1d.toInt().rgb(6, 6, 6),// 红
        )
    }

    // 地图上宝箱图标.先不用这个. 远古宝箱
    val hitBox by lazy {
        setOf(
            0xffb3965e.toInt().rgb(15, 15, 15),
            0xffb69b66.toInt().rgb(15, 15, 15),
            0xffeacf86.toInt().rgb(15, 15, 15),
            0xffcea970.toInt().rgb(15, 15, 15),
            0xffa58b5f.toInt().rgb(12),
            0xffa7915b.toInt().rgb(12),
            0xffa78d5c.toInt().rgb(12),
        )
    }


    fun filter(data: List<Pair<Int, Int>>, map: Array<IntArray>): MutableList<Pair<Int, Int>> {
        val selfInSmallMap =  GComponents.get().selfInSmallMap
        val smallMap =  GComponents.get().smallMap
        val out = mutableListOf<Pair<Int, Int>>()
        data.forEach {
            val hitLeft = (it.first - sp >= 0) && map[it.first - sp][it.second] == 1
            val hitRight = (it.first + sp < smallMap.width) && map[it.first + sp][it.second] == 1
            val hitTop = (it.second - sp >= 0) && map[it.first][it.second - sp] == 1
            val hitBottom = (it.second + sp < smallMap.height) && map[it.first][it.second + sp] == 1
            var count = 0
            if (hitLeft) count++
            if (hitRight) count++
            if (hitTop) count++
            if (hitBottom) count++
            val sp2 = sp * 2
            val hitLeft2 = (it.first - sp2 >= 0) && map[it.first - sp2][it.second] == 1
            val hitRight2 = (it.first + sp2 < smallMap.width) && map[it.first + sp2][it.second] == 1
            val hitTop2 = (it.second - sp2 >= 0) && map[it.first][it.second - sp2] == 1
            val hitBottom2 = (it.second + sp2 < smallMap.height) && map[it.first][it.second + sp2] == 1
            var count2 = 0
            if (hitLeft2) count2++
            if (hitRight2) count2++
            if (hitTop2) count2++
            if (hitBottom2) count2++
            map[it.first][it.second] =if (count >= 2 && count2 >= 1) {
                out.add(it.first to it.second)
                1
            } else 0
        }
        return out
    }

    fun checkPartByLastAngle(la: Int, edge: Int,radius:Int, x: Int, y: Int): Boolean {
        val minAngle: Int = (la % 360) + 360 - edge // 45 最好不要动
        val maxAngle = (la % 360) + 360 + edge
        val selfInSmallMap =  GComponents.get().selfInSmallMap
        val smallMap =  GComponents.get().smallMap
        val offsetX = x - selfInSmallMap.x
        val offsetY = y - selfInSmallMap.y
        val a = App.take().pointToAngle(offsetX, offsetY)
        val distance = sqrt((offsetX * offsetX + offsetY * offsetY).toDouble()).toInt()
        if (distance > radius) return false
        val angle = (a % 360) + 360
        return (angle in minAngle..maxAngle) ||
                (angle in (minAngle + 360)..(maxAngle + 360)) ||
                (angle in (minAngle - 360)..(maxAngle - 360))
    }


    // DBCAA0
    // C5B09A
    val hitMYBLEnterDoor by lazy {
        setOf(0xFF555555.toInt().rgb(4),
            0xFF574E4E.toInt().rgb(4),
            0xFF5A554A.toInt().rgb(4),
            0xFF5C5C5C.toInt().rgb(4),
            0xFF5F5F5F.toInt().rgb(4),
            0xFF635959.toInt().rgb(4),
            0xFF656565.toInt().rgb(4),
            0xFF6A6A6A.toInt().rgb(4),
            0xFF6C6C6C.toInt().rgb(4),
            0xFF787878.toInt().rgb(4),
            0xFF7A5035.toInt().rgb(4),
            0xFF7E512D.toInt().rgb(4),
            0xFF827771.toInt().rgb(4),
            0xFF895A3B.toInt().rgb(4),
            0xFF926D6D.toInt().rgb(4),
            0xFF98623D.toInt().rgb(4),
            0xFF9C7146.toInt().rgb(4),
            0xFFA96F3D.toInt().rgb(4),
            0xFFA97137.toInt().rgb(4),
            0xFFB0A692.toInt().rgb(4),
            //0xFFD0854A.toInt().rgb(4),
        )
    }
    val hitMYBLLightDoor by lazy {
        setOf(
            0xFF74593E.toInt().rgb(4),
            0xFF745A43.toInt().rgb(4),
            0xFF747474.toInt().rgb(4),
            0xFF75623A.toInt().rgb(4),
            0xFF765A3F.toInt().rgb(4),
            0xFF765E5E.toInt().rgb(4),
            0xFF766454.toInt().rgb(4),
            0xFF77593B.toInt().rgb(4),
            0xFF776363.toInt().rgb(4),
            0xFF785A3B.toInt().rgb(4),
            0xFF796D62.toInt().rgb(4),
            0xFF7A604D.toInt().rgb(4),
            0xFF7B5F46.toInt().rgb(4),
            0xFF7C6363.toInt().rgb(4),
            0xFF7C7063.toInt().rgb(4),
            0xFF7D7D64.toInt().rgb(4),
            0xFF7E6254.toInt().rgb(4),
            0xFF7E6969.toInt().rgb(4),
            0xFF7F6442.toInt().rgb(4),
            0xFF818167.toInt().rgb(4),
            0xFF836446.toInt().rgb(4),
            0xFF846546.toInt().rgb(4),
            0xFF847878.toInt().rgb(4),
            0xFF856F42.toInt().rgb(4),
            0xFF866B6B.toInt().rgb(4),
            0xFF896849.toInt().rgb(4),
            0xFF8A654B.toInt().rgb(4),
            0xFF8A6A4A.toInt().rgb(4),
            0xFF8A7345.toInt().rgb(4),
            0xFF8B6A4A.toInt().rgb(4),
            0xFF8B7445.toInt().rgb(4),
            0xFF8C6B4B.toInt().rgb(4),
            0xFF8F7060.toInt().rgb(4),
            0xFF907373.toInt().rgb(4),
            0xFF91694E.toInt().rgb(4),
            0xFF977768.toInt().rgb(4),
            0xFF9B7753.toInt().rgb(4),
            0xFF9D7954.toInt().rgb(4),
            0xFF9E7954.toInt().rgb(4),
            0xFFA08080.toInt().rgb(4),
            0xFFA48383.toInt().rgb(4),
            0xFFB19463.toInt().rgb(4),
            0xFFB6B692.toInt().rgb(4),
        )
    }



    val hitMYBLBorder by lazy {
        setOf(
            0xFF333333.toInt().rgb(4), //  墙
        )
    }

    val hitStartDoor by lazy {
        setOf(
            0xFF3A3A3A.toInt().rgb(4),
            0xFF3C3C3C.toInt().rgb(4),
            0xFF3E3E3E.toInt().rgb(4),
            0xFF404040.toInt().rgb(4),
            0xFF414141.toInt().rgb(4),
            0xFF473636.toInt().rgb(4),
            0xFF47372F.toInt().rgb(4),
            0xFF534545.toInt().rgb(4),
            0xFF736363.toInt().rgb(4),
            0xFF74583E.toInt().rgb(4),
            0xFF856647.toInt().rgb(4),
            0xFF936A50.toInt().rgb(4),
        )
    }
    val hitSelf by lazy {
        setOf(
            0xFFC9B097.toInt().rgb(4),
            0xFFCDBD9E.toInt().rgb(4),
            0xFFD3C392.toInt().rgb(4),
            0xFFD9C896.toInt().rgb(4),
//            0xFFDBCA98.toInt().rgb(4),
//            0xFFDCCB98.toInt().rgb(4),
//            0xFFDDCC99.toInt().rgb(4),
//            0xFFDEC89C.toInt().rgb(4),
            0xFFDCCB98.toInt().rgb(4),
            0xFFDEC89C.toInt().rgb(4),
        )
    }
    val hitTSBox by lazy {
        val out = mutableSetOf<ColorDiffer>()
        out.addAll(setOf(
//            0xFF715D3D.toInt().rgb(4),
//            0xFF7A6442.toInt().rgb(4),
//            0xFF836840.toInt().rgb(4),
//            0xFF856642.toInt().rgb(4),
//            0xFF897348.toInt().rgb(4),
//            0xFF8A6540.toInt().rgb(4),
//            0xFF8D6E3E.toInt().rgb(4),
//            0xFF906D4A.toInt().rgb(4),
//            0xFF937850.toInt().rgb(4),
//            0xFF947542.toInt().rgb(4),
//            0xFF9C8352.toInt().rgb(4),
//            0xFF9D804F.toInt().rgb(4),
//            0xFFAC915A.toInt().rgb(4),
//            0xFFB39261.toInt().rgb(4),
//            0xFFB99860.toInt().rgb(4),
//            0xFFB99861.toInt().rgb(4),
//            0xFFBD9C63.toInt().rgb(4),
//            0xFFC6AB6A.toInt().rgb(4),
//            0xFFC9AA6B.toInt().rgb(4),
//            0xFFCDA86F.toInt().rgb(4),
//            0xFFE0A060.toInt().rgb(4),


            0xFF805C36.toInt().rgb(8),
            0xFF816340.toInt().rgb(8),
            0xFF826340.toInt().rgb(8),
            0xFF83594F.toInt().rgb(8),
            0xFF836841.toInt().rgb(8),
            0xFF846543.toInt().rgb(8),
            0xFF856642.toInt().rgb(8),
            0xFF876846.toInt().rgb(8),
            0xFF88653D.toInt().rgb(8),
            0xFF8A6540.toInt().rgb(8),
            0xFF8A6846.toInt().rgb(8),
            0xFF8B643D.toInt().rgb(8),
            0xFF8C6D46.toInt().rgb(8),
            0xFF8C724C.toInt().rgb(8),
            0xFF8D6E3E.toInt().rgb(8),
            0xFF8D734C.toInt().rgb(8),
            0xFF8F7348.toInt().rgb(8),
            0xFF90704A.toInt().rgb(8),
            0xFF92533E.toInt().rgb(8),
            0xFF927044.toInt().rgb(8),
            0xFF92784F.toInt().rgb(8),
            0xFF937850.toInt().rgb(8),
            0xFF947542.toInt().rgb(8),
            0xFF95754E.toInt().rgb(8),
            0xFF976C40.toInt().rgb(8),
            0xFF977A4D.toInt().rgb(8),
            0xFF987C53.toInt().rgb(8),
            0xFF9A6F44.toInt().rgb(8),
            0xFF9B5741.toInt().rgb(8),
            0xFF9C814D.toInt().rgb(8),
            0xFF9C8352.toInt().rgb(8),
            0xFF9D8251.toInt().rgb(8),
            0xFF9E8553.toInt().rgb(8),
            0xFFA07244.toInt().rgb(8),
            0xFFA17850.toInt().rgb(8),
            0xFFA28458.toInt().rgb(8),
            0xFFA38453.toInt().rgb(8),
            0xFFA5895B.toInt().rgb(8),
            0xFFA77E53.toInt().rgb(8),
            0xFFA88A5B.toInt().rgb(8),
            0xFFA9844A.toInt().rgb(8),
            0xFFAA8A57.toInt().rgb(8),
            0xFFAB9654.toInt().rgb(8),
            0xFFAC8B58.toInt().rgb(8),
            0xFFAD925B.toInt().rgb(8),
            0xFFAE884C.toInt().rgb(8),
            0xFFAF7D57.toInt().rgb(8),
            0xFFB18C5D.toInt().rgb(8),
            0xFFB37C4D.toInt().rgb(8),
            0xFFB39261.toInt().rgb(8),
            0xFFB5905F.toInt().rgb(8),
            0xFFB59A65.toInt().rgb(8),
            0xFFB6995F.toInt().rgb(8),
            0xFFB79660.toInt().rgb(8),
            0xFFB89764.toInt().rgb(8),
            0xFFB89D67.toInt().rgb(8),
            0xFFB99860.toInt().rgb(8),
            0xFFB9A25C.toInt().rgb(8),
            0xFFBBA064.toInt().rgb(8),
            0xFFBD9C63.toInt().rgb(8),
            0xFFBE9F64.toInt().rgb(8),
            0xFFC28D65.toInt().rgb(8),
            0xFFC29F69.toInt().rgb(8),
            0xFFC2AA60.toInt().rgb(8),
            0xFFC49D68.toInt().rgb(8),
            0xFFC5AA6A.toInt().rgb(8),
            0xFFC7925C.toInt().rgb(8),
            0xFFC8A96B.toInt().rgb(8),
            0xFFCA9764.toInt().rgb(8),
            0xFFCCA05B.toInt().rgb(8),
            0xFFCEA970.toInt().rgb(8),
            0xFFD2B76E.toInt().rgb(8),
            0xFFD5AE74.toInt().rgb(8),
            0xFFD89F65.toInt().rgb(8),
            0xFFDC9D5E.toInt().rgb(8),
            0xFFDEA76F.toInt().rgb(8),
            0xFFE1A970.toInt().rgb(8),
            0xFFE4BA7C.toInt().rgb(8),
            0xFFEBC797.toInt().rgb(8),
        ))
        out
    }
}